package com.hsnn.medstgmini.sys.service.impl;

import java.util.Date;
import java.util.List;

import javax.transaction.Transactional;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.hsnn.medstgmini.base.std.dao.StdCompinfoDao;
import com.hsnn.medstgmini.base.std.dao.StdExpertDao;
import com.hsnn.medstgmini.base.std.dao.StdHealthbureauDao;
import com.hsnn.medstgmini.base.std.dao.StdHospInfoDao;
import com.hsnn.medstgmini.base.std.model.StdCompinfo;
import com.hsnn.medstgmini.base.std.model.StdHealthbureau;
import com.hsnn.medstgmini.dao.HibernateSqlUtil;
import com.hsnn.medstgmini.model.Whether;
import com.hsnn.medstgmini.sys.dao.SysUserDao;
import com.hsnn.medstgmini.sys.model.SysPrivilege;
import com.hsnn.medstgmini.sys.model.SysRole;
import com.hsnn.medstgmini.sys.model.SysUser;
import com.hsnn.medstgmini.sys.model.UserType;
import com.hsnn.medstgmini.sys.service.SysUserManager;
import com.hsnn.medstgmini.util.Pagination;

/**
 * @category 用户管理
 * @author 蔡春龙
 * @date 2015年6月15日
 */
@Service
public class SysUserManagerImpl implements SysUserManager {

	@Autowired
	private SysUserDao userDao;

	@Autowired
	private StdHospInfoDao hospInfoDao;

	@Autowired
	private StdCompinfoDao compinfoDao;

	@Autowired
	private StdHealthbureauDao stdHealthbureauDao;

	@Autowired
	private StdExpertDao stdExpertDao;

	@Autowired
	private HibernateSqlUtil dao;

	/**
	 * @category 根据用户名查询用户
	 * @date 2015年6月15日
	 * @param username
	 * @return
	 */
	public SysUser getUserByUsername(String username) {
		SysUser user = userDao.getUserByUsername(username);
		if (user != null) {
			Integer type = user.getType();
			if (type != null) {
				String orgId = user.getOrgId();
				if (user.getMain() == Whether.no.getKey()) {
					SysUser root = userDao.getRootFatherUser(user);
					user.setRootUser(root);
				}
				if (type == UserType.yy.getKey()) {// 医疗机构
					user.setInfo(hospInfoDao.getHospInfoById(orgId));
				} else if (type == UserType.sc.getKey()
						|| type == UserType.ps.getKey()) {// 企业
					List<StdCompinfo> list = compinfoDao
							.queryStdCompinfoById(orgId);
					if (list != null && list.size() > 0) {
						user.setInfo(list.get(0));
					}
				} else if (type == UserType.zx.getKey()
						|| type == UserType.hszx.getKey()) {
					List<StdHealthbureau> list = stdHealthbureauDao
							.queryStdHealthbureauById(orgId);
					if (list != null && list.size() > 0) {
						user.setInfo(list.get(0));
					}
				} else if (type == UserType.zj.getKey()) {
					user.setInfo(stdExpertDao.getStdExpertById(orgId));
				}
			}
		}
		return user;
	}

	/**
	 * @category 保存登陆ip，登陆时间，登陆次数等信息
	 * @date 2015年6月15日
	 * @param user
	 */
	@Transactional
	public void saveLoginInfo(SysUser user) {
		userDao.saveLoginInfo(user);
	}

	/**
	 * @category 中心分页查询用户列表
	 * @date 2015年6月16日
	 * @param user
	 * @return
	 */
	public Pagination getZxUserList(Pagination page, SysUser user) {
		return userDao.getZxUserList(page, user);
	}

	/**
	 * @category 启用|停用
	 * @param user
	 */
	@Transactional
	public void changeStatus(SysUser user) {
		userDao.changeStatus(user);
	}

	/**
	 * @category 批量(启用|停用)
	 * @param list
	 */
	@Transactional
	public void batchChangeStatus(List<SysUser> list) {
		userDao.batchChangeStatus(list);
	}

	/**
	 * @category 根据id查询用户
	 * @date 2015年6月17日
	 * @param id
	 * @return
	 */
	public SysUser getUserById(String id) {
		return userDao.getUserById(id);
	}
	public SysUser getUserByOrgId(String OrgId) {
		return userDao.getUserByOrgId(OrgId);
	}

	/**
	 * @category 获取sequence
	 */
	@Transactional
	public Long getSequence() {
		return userDao.getSequence();
	}

	/**
	 * @category 中心保存主用户信息
	 * @date 2015年6月14日
	 * @param user
	 */
	@Transactional
	public void zxSaveUser(int opType, SysUser user, List<SysPrivilege> list) {
		userDao.zxSaveUser(opType, user, list);
	}

	/**
	 * @category 中心、医疗机构、企业查询子用户列表
	 * @date 2015年6月18日
	 * @param page
	 * @param loginUser当前登人
	 * @param user查询条件
	 * @return
	 */
	public Pagination getSubUserList(Pagination page, SysUser loginUser,
			SysUser user) {
		return userDao.getSubUserList(page, loginUser, user);
	}

	/**
	 * @category 中心修改密码
	 * @date 2015年6月19日
	 * @param id
	 * @param password
	 */
	public void changePassword(String id, String password) {
		userDao.changePassword(id, password);
	}

	@Override
	public void saveZUser(SysUser user, String updUser) {
		userDao.saveZUser(user, updUser);
		userDao.writeUserLog(user.getId());
	}

	@Transactional
	public Boolean addSysUser(SysUser user) {
		if (dao.add(user)) {
			userDao.writeUserLog(user.getId());
			return true;
		} else {
			return false;
		}
	}

	@Override
	public Pagination getHospInfoList(Pagination page) {
		return userDao.getHospInfoList(page);
	}

	@Override
	public Pagination getCompInfoList(Pagination page) {
		return userDao.getCompInfoList(page);
	}

	@Override
	public Pagination getStdExpertList(Pagination page) {
		return userDao.getStdExpertList(page);
	}

	@Override
	public Pagination getStdHealthbureauList(Pagination page) {
		return userDao.getStdHealthbureauList(page);
	}

	@Override
	public List<SysRole> getSysRoleListByType(String id) {
		return userDao.getSysRoleListByType(id);
	}

	@Transactional
	public Boolean addSysUserRoleAndPrivilege(String userId, String roleId,
			Date updTime, String updUser) {
		if (userDao.addSysUserRole(userId, roleId, updTime)) {
			userDao.writeSysUserRoleLog(userId, updTime, updUser);
			List<String> list = userDao.getRolePrivilegeList(roleId);
			boolean temp = userDao.addPrivilege(userId, list, updTime);
			userDao.writeSysUserPrivilegeLog(userId, updTime, updUser);
			return temp;
		}
		return false;

	}

	/**
	 * @category 根据机构id及主账户查询父级id
	 * @author 韩守松
	 * @date 2015年10月16日
	 * @param @return
	 */
	public String getPidId(String orgId, Integer main) {
		return userDao.getPidId(orgId, main);
	}

	@Override
	public List<Object> getExpSkillsList() {
		return userDao.getExpSkillsList();
	}

	@Override
	public List<String> getSubUserByzxId(String id) {
		return userDao.getSubUserByzxId(id);
	}

	/**
	 * @category 查询所有用户信息
	 * @author 韩守松
	 * @date 2015年11月11日
	 * @param @param page
	 * @param @param user
	 * @param @return
	 */
	public Pagination getAllZxUserList(Pagination page, SysUser user) {
		return userDao.getAllZxUserList(page, user);
	}

	/**
	 * @category 根据角色id获取角色信息
	 * @author 韩守松
	 * @date   2015年12月19日
	 * @param  @param roleId
	 * @param  @return
	 */
	public SysRole getSysRoleByRoleId(String roleId) {
		return userDao.getSysRoleByRoleId(roleId);
	}
	
	/**
	 * @category 添加医疗机构收货地址
	 * @author wangbing
	 * @date   2015年12月19日
	 * @param  @param roleId
	 * @param  @return
	 */
	@Override
	public void addHospAddress(String userId,String updUser){
		userDao.addHospAddress(userId, updUser);
	}
	public void addZUser(SysUser user){
		userDao.addZUser(user);
	}
	@Transactional
	public void saveUserRole(List<String> list, String userId){
		userDao.saveUserRole(list,userId);
	}
	@Transactional
	public void deleteUser(List<String> list){
		userDao.deleteUser(list);
	}
}